{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Audio effects and playback with Librosa and IPython Notebook\n",
    "\n",
    "This notebook will demonstrate how to do audio effects processing with librosa and IPython notebook.  You will need IPython 2.0 or later.\n",
    "\n",
    "By the end of this notebook, you'll know how to do the following:\n",
    "\n",
    "  - Play audio in the browser\n",
    "  - Effect transformations such as harmonic/percussive source separation, time stretching, and pitch shifting\n",
    "  - Decompose and reconstruct audio signals with non-negative matrix factorization\n",
    "  - Visualize spectrogram data"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "from __future__ import print_function"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [],
   "source": [
    "import librosa\n",
    "import librosa.display\n",
    "import IPython.display\n",
    "import numpy as np"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [],
   "source": [
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Load the example track\n",
    "y, sr = librosa.load(librosa.util.example_audio_file())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Play it back!\n",
    "IPython.display.Audio(data=y, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [],
   "source": [
    "# How about separating harmonic and percussive components?\n",
    "y_h, y_p = librosa.effects.hpss(y)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Play the harmonic component\n",
    "IPython.display.Audio(data=y_h, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Play the percussive component\n",
    "IPython.display.Audio(data=y_p, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Pitch shifting?  Let's gear-shift by a major third (4 semitones)\n",
    "y_shift = librosa.effects.pitch_shift(y, sr, 7)\n",
    "\n",
    "IPython.display.Audio(data=y_shift, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Or time-stretching?  Let's slow it down\n",
    "y_slow = librosa.effects.time_stretch(y, 0.5)\n",
    "\n",
    "IPython.display.Audio(data=y_slow, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [],
   "source": [
    "# How about something more advanced?  Let's decompose a spectrogram with NMF, and then resynthesize an individual component\n",
    "D = librosa.stft(y)\n",
    "\n",
    "# Separate the magnitude and phase\n",
    "S, phase = librosa.magphase(D)\n",
    "\n",
    "# Decompose by nmf\n",
    "components, activations = librosa.decompose.decompose(S, n_components=8, sort=True)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 864x288 with 2 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "# Visualize the components and activations, just for fun\n",
    "\n",
    "plt.figure(figsize=(12,4))\n",
    "\n",
    "plt.subplot(1,2,1)\n",
    "librosa.display.specshow(librosa.amplitude_to_db(np.abs(components), ref=np.max), y_axis='log')\n",
    "plt.xlabel('Component')\n",
    "plt.ylabel('Frequency')\n",
    "plt.title('Components')\n",
    "\n",
    "plt.subplot(1,2,2)\n",
    "librosa.display.specshow(activations, x_axis='time')\n",
    "plt.xlabel('Time')\n",
    "plt.ylabel('Component')\n",
    "plt.title('Activations')\n",
    "\n",
    "plt.tight_layout()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 13,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "(1025, 8) (8, 2647)\n"
     ]
    }
   ],
   "source": [
    "print(components.shape, activations.shape)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Play back the reconstruction\n",
    "# Reconstruct a spectrogram by the outer product of component k and its activation\n",
    "D_k = components.dot(activations)\n",
    "\n",
    "# invert the stft after putting the phase back in\n",
    "y_k = librosa.istft(D_k * phase)\n",
    "\n",
    "# And playback\n",
    "print('Full reconstruction')\n",
    "\n",
    "IPython.display.Audio(data=y_k, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Resynthesize.  How about we isolate just first (lowest) component?\n",
    "k = 0\n",
    "\n",
    "# Reconstruct a spectrogram by the outer product of component k and its activation\n",
    "D_k = np.multiply.outer(components[:, k], activations[k])\n",
    "\n",
    "# invert the stft after putting the phase back in\n",
    "y_k = librosa.istft(D_k * phase)\n",
    "\n",
    "# And playback\n",
    "print('Component #{}'.format(k))\n",
    "\n",
    "IPython.display.Audio(data=y_k, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Resynthesize.  How about we isolate a middle-frequency component?\n",
    "k = len(activations) // 2\n",
    "\n",
    "# Reconstruct a spectrogram by the outer product of component k and its activation\n",
    "D_k = np.multiply.outer(components[:, k], activations[k])\n",
    "\n",
    "# invert the stft after putting the phase back in\n",
    "y_k = librosa.istft(D_k * phase)\n",
    "\n",
    "# And playback\n",
    "print('Component #{}'.format(k))\n",
    "\n",
    "IPython.display.Audio(data=y_k, rate=sr)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "# Resynthesize.  How about we isolate just last (highest) component?\n",
    "k = -1\n",
    "\n",
    "# Reconstruct a spectrogram by the outer product of component k and its activation\n",
    "D_k = np.multiply.outer(components[:, k], activations[k])\n",
    "\n",
    "# invert the stft after putting the phase back in\n",
    "y_k = librosa.istft(D_k * phase)\n",
    "\n",
    "# And playback\n",
    "print('Component #{}'.format(k))\n",
    "\n",
    "IPython.display.Audio(data=y_k, rate=sr)"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3.7",
   "language": "python",
   "name": "py37"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.7.3"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
